package ongd.web;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import ongd.negocio.gestion.ControladorUsuario;
import ongd.negocio.gestion.Usuario;
import ongd.servicios.persistencia.exceptions.PreexistingEntityException;
import org.primefaces.context.RequestContext;

/**
 * Clase que se encargará de insertar un usuario.
 *
 * @author <a href="mailto:egi0002@alu.ubu.es">Elena García Iglesias</a>
 * @author <a href="mailto:cms0021@alu.ubu.es">Cristina Martínez Sanz</a>
 * @version 1.0 20120124
 *
 */
@ManagedBean
@ViewScoped
public class Insertar_Usuario extends ABean {

    /**
     * Objeto del tipo controladroUsuario que nos servirá para realizar
     * todas las operaciones necesarias para crear un usuario.
     */
    private ControladorUsuario contUsuario;
    /**
     * Objeto de tipo usuario que guarda los datos del usuario que queremos crear.
     */
    private Usuario usuario;
    /**
     * Objeto de tipo string que guarda una contraseña de comprobación.
     */
    private String password;
    /**
     * Objeto de tipo String que va a contener el título de la página donde
     * estemos.
     */
    private String titulo;

    /** 
     * Constructor de la clase.
     */
    public Insertar_Usuario() {
        SesionBean sesion = getSesionBean();
        contUsuario = sesion.getControladorUsuario();
        if (sesion.iniciadaSesion()) {
            titulo = "Insertar - Nuevo Usuario";
            usuario = new Usuario();
        }
    }

    /**
     * Método que carga los valores inciales en función del tipo de acceso a la página.
     */
    @Override
    public void cargaInicial() {
    }

    /**
     * Método que inserta un nuevo usuario.
     * @return null.
     */
    public String insertar() {
        if (getSesionBean().iniciadaSesion()) {
            RequestContext requestContext = RequestContext.getCurrentInstance();
            try {
                //Miramos que las dos contraseñas sean iguales
                if (password.compareTo(usuario.getPassword()) == 0) {
                    //Si hemos elegido que queremos avisos hay que introducir obligatoriamente un emal.
                    if ((usuario.getAvisos() && usuario.getEmail().compareTo("") != 0) || !usuario.getAvisos()) {
                        if (contUsuario.crearUsuario(usuario)) {
                            requestContext.addCallbackParam("creado", true);
                            usuario = new Usuario();
                            password = new String();
                        } else {
                            requestContext.addCallbackParam("creadoNo", true);
                        }
                    } else {
                        requestContext.addCallbackParam("faltaEmail", true);
                    }
                } else {
                    requestContext.addCallbackParam("contraseñasIncorrectas", true);
                    usuario.setPassword("");
                    setPassword("");
                }
            } catch (PreexistingEntityException ex) {
                Logger.getLogger(Insertar_Usuario.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(Insertar_Usuario.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    /**
     * Método que devuelve el controlador de usuario.
     * @return controlador de usuario.
     * @see #setContUsuario
     */
    public ControladorUsuario getContUsuario() {
        return contUsuario;
    }

    /**
     * Método que devuelve el usuario.
     * @return usuario.
     * @see #setUsuario
     */
    public Usuario getUsuario() {
        return usuario;
    }

    /**
     * Método que devuelve la contraseña.
     * @return contraseña.
     * @see #setPassword
     */
    public String getPassword() {
        return password;
    }

    /**
     * Método que da un nuevo valor al controlador de usuario.
     * @param contUsuario nuevo valor del controlador. 
     * @see #getContUsuario
     */
    public void setContUsuario(ControladorUsuario contUsuario) {
        this.contUsuario = contUsuario;
    }

    /**
     * Método que asigna un nuevo valor al usuario.
     * @param usuario nuevo usuario. 
     * @see #getUsuario
     */
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    /**
     * Método que asigna un nuevo valor a la variable que almacena el password.
     * @param password nuevo valor de la variable. 
     * @see #getPassword
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * Método que devuelve el valor de la variable titulo.
     * @return titulo
     * @see #setTitulo
     */
    public String getTitulo() {
        return titulo;
    }

    /**
     * Método que establece el valor de la variable título.
     * @param titulo Nuevo valor de la variable
     * @see #getTitulo
     */
    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
}
